home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tmdsp / tclr.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  2KB  |  90 lines

  1. /*
  2.     TCLR.C Ver 0.02 1991.08.09  by Y.Kurihara (Nif PDC01620)"
  3.         T-MENU の画面にちょっかいを出すプログラム  その1
  4.  
  5.     (1) TCLR
  6.     (2) TCLR  <X座標> <Y座標> <桁数> <行数>
  7.  
  8.     (1) 全画面をクリア
  9.     (2) 指定範囲をクリアする
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <dos.h>
  15. #include <machine.h>
  16.  
  17. #define  X0    (2)
  18. #define  Xl    (76)
  19. #define  Y0    (7)
  20. #define  Yl    (20)
  21.  
  22. #define VRAM( offset )  ( (char far *)MK_FP( 0xc000,( offset ) ) )
  23. #define PORTpage     (0xff83)
  24. #define PORTplane    (0xff81)
  25. #define Y1page       (256)
  26.  
  27.  
  28. void clr( int x1,int y1,int x2,int y2 )
  29. {
  30.     unsigned int x,y;
  31.     unsigned int off;
  32.  
  33.     if( y1 < Y1page ) {
  34.         outp( PORTpage, 0x00 );
  35.         off = y1 * 128;
  36.     } else {
  37.         outp( PORTpage, 0x10 );
  38.         off = ( y1 - Y1page )* 128;
  39.     }
  40.     for( y = y1; y <= y2; y++ ) {
  41.         if( y == Y1page ) {
  42.             outp( PORTpage, 0x10 );
  43.             off -= Y1page * 128;
  44.         }
  45.         for( x = x1; x <= x2; x++ ) {
  46.             *VRAM( off + x ) = 0xff;
  47.         }
  48.         off += 128;
  49.     }
  50.     return;
  51. }
  52.  
  53. main( int argc,char **argv )
  54. {
  55.     int save_page;
  56.     int save_plane;
  57.     int x1 = X0;
  58.     int y1 = Y0;
  59.     int x2 = Xl;
  60.     int y2 = Yl;
  61.  
  62.     if( argc >= 2 )  x1 = atoi( argv[1] );
  63.     if( argc >= 3 )  y1 = atoi( argv[2] );
  64.     if( argc >= 4 )  x2 = atoi( argv[3] );
  65.     if( argc >= 5 )  y2 = atoi( argv[4] );
  66.  
  67.     if( x1 < 0 || y1 < 0 || x2 < 1 || y2 < 1 )  exit(1);
  68.     if( x1 >= 80 || y1 >= 30 )  exit(1);
  69.     if( ( x2 = x1 + x2 - 1 ) >= 80 )  x2 = 79;
  70.     if( ( y2 = y1 + y2 - 1 ) >= 30 )  y2 = 29;
  71.  
  72.     if( argc < 2 ) {
  73.         y1 = y1 *16 - 4;
  74.         y2 = y2 *16 + 19;
  75.     } else {
  76.         y1 = y1 *16;
  77.         y2 = y2 *16 + 15;
  78.     }
  79.  
  80.     save_page  = inp( PORTpage );
  81.     save_plane = inp( PORTplane );
  82.     outp( PORTplane,15 );
  83.  
  84.     clr( x1,y1,x2,y2 );
  85.  
  86.     outp( PORTpage,  save_page );
  87.     outp( PORTplane, save_plane );
  88.     exit( 0 );
  89. }
  90.